package com.zbkj.service.service.monitor;

import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.admin.SystemAdmin;
import com.zbkj.common.model.monitor.ZfbMonitorEquipment;
import com.zbkj.common.monitorchannel.GetDeviceModelV3Request;
import com.zbkj.common.monitorchannel.GetMultiMediaAddrV3Request;
import com.zbkj.common.monitorchannel.GetMultiMediaAddrV3Response;
import com.zbkj.common.monitorchannel.GetMultiMediaRecordV3Request;
import com.zbkj.common.monitorchannel.vo.*;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.MonitorControlLightRequest;
import com.zbkj.common.request.MonitorControlLightUserinfoRequest;
import com.zbkj.common.request.monitor.*;
import com.zbkj.common.response.*;
import com.zbkj.common.response.monitor.ZfbMonitorEquipmentResponse;

import java.util.List;

public interface IZfbMonitorEquipmentService extends IService<ZfbMonitorEquipment> {

    PageInfo<ZfbMonitorEquipment> getAdminPage(ZfbMonitorEquipmentRequest pageParamRequest);
    PageInfo<ZfbMonitorEquipment> getAdminPagePublicly(ZfbMonitorEquipmentRequest pageParamRequest);
    PageInfo<ZfbMonitorEquipment> getAdminPageMerchant(ZfbMonitorEquipmentRequest pageParamRequest);

    /**
     * 查询客户机要展示的监控列表
     * @param pageParamRequest
     * @return
     */
    PageInfo<ZfbMonitorEquipment> getClientPage(ZfbMonitorEquipmentRequest pageParamRequest);
    /**
     * 新增
     *
     * @param monitorEquipmentAddReq
     * @return
     */
    boolean addMonitorEquipment(ZfbMonitorEquipmentAddReq monitorEquipmentAddReq, SystemAdmin systemAdmin);


    /**
     * 修改
     *
     * @param monitorEquipmentAddReq
     * @return
     */
    boolean editMonitorEquipment(ZfbMonitorEquipmentAddReq monitorEquipmentAddReq, SystemAdmin systemAdmin);


    /**
     * 删除
     *
     * @param deleteRequest
     * @return
     */
    boolean deleteMonitorEquipment(ZfbMonitorEquipmentDeleteReq deleteRequest, SystemAdmin systemAdmin);


    /**
     * 查询商户列表
     *
     * @param searchRequest
     * @return
     */
    CommonPage<ZfbMonitorEquipmentResponse> getMerchantPageList(ZfbMonitorEquipmentSearchReq searchRequest, SystemAdmin systemAdmin);


    /**
     * 绑定商品
     *
     * @param bindProductRequest
     * @return
     */
    boolean merchantBindProduct(ZfbMonitorEquipmentBindProductReq bindProductRequest, SystemAdmin systemAdmin);


    /**
     * 唤醒设备
     *
     * @param license
     * @return
     */
    boolean wakeUpEquipment(String[] license);

    boolean wakeUpEquipment(String license);

    List<String> wakeUpEquipmentOptimized(String[] license);

    /**
     * 查询设备状态
     *
     * @param license
     * @return
     */
    MonitorChannelEquipmentStatusVo getEquipmentStatus(String license);


    /**
     * 查询设备流媒体地址
     *
     * @param license
     * @return
     */
    MonitorChannelMediaAddressVo getMediaAddress(String license);


    /**
     * ptz控制设备
     *
     * @param ctrlPTZRequestVo
     * @return
     */
    boolean ctrlPTZ(CtrlPTZRequestVo ctrlPTZRequestVo);


    /**
     * 通过该命令向设备设置时间信息
     *
     * @param setTimeRequestVo
     * @returnD
     */
    boolean setTime(MonitorSetTimeRequestVo setTimeRequestVo);


    /**
     * 通知设备进⾏行行物理理变焦
     * 鹤梦云-2.6.2.8.6 通知设备进⾏行行物理理变焦
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo setAdjustFocalLength(AdjustFocalLengthRequestVo requestVo);


    /**
     * 通知设备抓图
     * 鹤梦云-4.6.2.2.8 通知设备抓图
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo noticeDeviceUploadPicRequest(NoticeDeviceUploadPicRequestVo requestVo);


    /**
     * 查询设备云端录像⽇日历
     * 4.6.2.3.1 查询设备云端录像⽇日历
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<VideoQueryCalendarResultVo> getVideoQueryCalendar(VideoQueryCalendarRequestVo requestVo);


    /**
     * 查询设备云端录像列列表
     * 4.6.2.3.2 查询设备云端录像列列表
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<VideoQueryListResultVo> getVideoQueryList(VideoQueryListRequestVo requestVo);

    /**
     * 查询设备云端录像详情
     * 4.6.2.3.3 查询设备云端录像详情
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<VideoQueryDetailResultVo> getVideoQueryDetail(VideoQueryDetailRequestVo requestVo);


    /**
     * 查询设备云端图⽚片列列表
     * 4.6.2.2.2 查询设备云端图⽚片列列表
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<PictureQueryListResultVo> getPictureQueryList(VideoQueryListRequestVo requestVo);


    /**
     * 查询设备云端图⽚片详情
     * 4.6.2.2.3 查询设备云端图⽚片详情
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<PictureQueryDetailResultVo> getPictureQueryDetail(PictureQueryDetailRequestVo requestVo);


    /**
     * 查询设备云端图⽚片详情
     * 鹤梦云-4.6.2.2.7 查询设备本地图⽚片列列表(须设备在线才可查询)
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<GetLocalPicListResultVo> getGetLocalPicList(VideoQueryListRequestVo requestVo);


    /**
     * 查询设备本地录像列列表
     * 鹤梦云-4.6.2.3.5 查询设备本地录像列列表
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo<GetLocalFileListResultVo> getLocalFileList(GetLocalFileListRequestVo requestVo);


    /**
     * 鹤梦云-4.6.2.2.5 根据事件时间查询设备云端图⽚片详情
     */
    ThirdMonitorResultVo<PictureQueryDetailByTimeResultVo> QueryDetailByTime(QueryDetailByTimeRequestVo requestVo);


    /**
     * 4.5.1 根据产品ID进⾏行行订阅数据
     *
     * @param requestVo
     * @return
     */
    ThirdMonitorResultVo subscribe(MonitorSubscribeRequestVo requestVo);

    List<ZfbMonitorEquipment> getMonitorLicense(List<String> licenseList);


    /**
     * 4.6.2.6.3 摄像头开关
     *
     * @param setOpenFlagVo
     * @return
     */
    ThirdMonitorResultVo setOpenFlag(MonitorSetOpenFlagVo setOpenFlagVo);


    /**
     * 4.6.2.3.4 查询设备本地录像⽇日历
     *
     * @param getLocalFileCalendarVo
     * @return
     */
    ThirdMonitorResultVo getLocalFileCalendar(GetLocalFileCalendarVo getLocalFileCalendarVo);


    /**
     * 获取v3版本的 accessToken
     *
     * @return
     */
    String getV3AccessToken();

    /**
     * 5.5.8.2 获取 TF 录像回放地址标准流地址
     * 功能说明：
     * 1、获取设备流媒体录像回放地址；
     * 2、请求路径 url: /GMModule/V3/Media/GetMultiMediaRecordAddr；
     *
     * @param requestVo
     * @return
     */
    GetMultiMediaRecordAddrV3Response GetMultiMediaRecordAddr(GetMultiMediaRecordAddrV3Request requestVo, Integer equipmentType);


    /**
     * 5.5.3.2 查询 TF 卡录像列表
     * 功能说明：
     * 1、按照日期查询 TF 卡录像列表；
     * 2、请求 URL；/GMModule/V3/Device/GetLocalFileList；
     *
     * @param requestVo
     * @return
     */
    GetLocalFileListV3Response GetLocalFileList(GetLocalFileListV3Request requestVo, Integer equipmentType);


    /**
     * 5.5.3.3 查询 TF 卡事件日历
     * 功能说明：
     * 1、查询 TF 卡那天存在报警事件；
     * 2、请求 URL；/GMModule/V3/Device/GetLocalEventCalendar
     *
     * @param requestVo
     * @return
     */
    GetLocalEventCalendarV3Response GetLocalEventCalendar(GetLocalEventCalendarV3Request requestVo, Integer equipmentType);


    /**
     * 5.2.2 用户账号添加/删除设备
     * 功能说明：
     * 1、用户添加或者删除设备；
     * 2、该接口影响用户对设备的所有操作;
     * 3、请求路径 url: /GMModule/SetDevices;
     *
     * @param requestVo
     * @return
     */
    SetDevicesV3Response SetDevices(SetDevicesV3Request requestVo, Integer equipmentType);


    /**
     * 5.5.1.1 查询设备的业务配置
     * 功能说明：
     * 1、根据功能模块类型查询设备的配置和能力；
     * 2、请求 URL；/GMModule/V3/Device/GetDeviceModel;
     *
     * @param requestVo
     * @return
     */
    JSONObject GetDeviceModel(GetDeviceModelV3Request requestVo, Integer equipmentType);


    /**
     * 5.5.8.1 获取直播播放地址
     * 功能说明：
     * 1、获取设备流媒体直播地址；
     * 2、请求路径 url: /GMModule/V3/Media/GetMultiMediaAddr；
     *
     * @param requestVo
     * @return
     */
    GetMultiMediaAddrV3Response GetMultiMediaAddr(GetMultiMediaAddrV3Request requestVo, Integer equipmentType);


    /**
     * 5.5.8.2获取TF录像回放地址标准流地址
     * 1、获取设备流媒体录像回放地址；
     * 2、请求路径url:/GMModule/V3/Media/GetMultiMediaRecordAddr；
     *
     * @param request
     * @return
     */
    GetMultiMediaAddrV3Response GetMultiMediaRecordV3Request(GetMultiMediaRecordV3Request request, Integer i);


    /**
     * 5.5.4.7 摄像机开关
     * 功能说明：
     * 1、关闭摄像机后，停止所有录制，同时app默认不可以观看，同时镜头转向隐私位；
     * 2、请求URL；/GMModule/V3/Device/SetOpenFlag
     *
     * @param requestVo
     * @return
     */
    JSONObject v3SetOpenFlag(MonitorSetOpenFlagVo requestVo, Integer equipmentType);

    /**
     * 5.5.4.2 重启设备
     * 功能说明：
     * 1、重启设备；
     * 2、请求URL；/GMModule/V3/Device/RebootDevice
     *
     * @param requestVo
     * @return
     */
    JSONObject v3RebootDevice(MonitorRebootDeviceVo requestVo, int equipmentType);


    /**
     * 5.5.4.3 检测设备版本是否可升级
     * 功能说明：
     * 1、后台比较设备当前版本号与后台版本号，当后台版本呢大于当前版本，则可升级；
     * 比较方式：strcmp("当前版本号","后台版本号") > 0 ；
     * 2、请求 URL；；/GMModule/V3/Device/CheckDeviceUpgradeVersion
     *
     * @param requestVo
     * @return
     */
    JSONObject v3CheckDeviceUpgradeVersion(MonitorBaseVo requestVo, int equipmentType);


    /**
     * 5.5.4.4 通知设备升级到最新版本
     * 功能说明：
     * 1、当检测设备有新版后，通知设备进行 OTA；
     * 2、请求 URL；/GMModule/V3/Device/NoticeUpgradeDeviceToLatestVersion
     *
     * @param requestVo
     * @return
     */
    JSONObject v3NoticeUpgradeDeviceToLatestVersion(MonitorBaseVo requestVo, int equipmentType);


    /**
     * 5.5.4.17 获取 TF 卡信息
     * 功能说明：
     * 1、查询 TF 卡的容量信息；
     * 2、请求 URL；/GMModule/V3/Device/GetSDCardInfo
     *
     * @param requestVo
     * @returnF
     */
    MonitorGetSDCardInfoResultVo v3GetSDCardInfo(MonitorBaseVo requestVo, int equipmentType);


    /**
     * 5.5.4.18 格式化 TF 卡
     * 功能说明：
     * 1、格式话设备 TF 卡，TF 卡数据将会全部丢失；
     * 2、请求 URL；/GMModule/V3/Device/FormatSDCard
     *
     * @param requestVo
     * @return
     */
    JSONObject v3FormatSDCard(MonitorBaseVo requestVo, int equipmentType);

    /**
     * 5.5.4.19 设置设备名称
     * 功能说明：
     * 1、修改设备的名称；
     * 2、请求 URL；/GMModule/V3/Device/SetDeviceName
     *
     * @param requestVo
     * @return
     */
    JSONObject v3SetDeviceName(MonitorSetDeviceNameVo requestVo, int equipmentType);

    /**
     * 5.5.4.26 控制设备进行放大和缩小
     * 功能说明：
     * 1、当设备具有变焦能力的时候，通过该接口通知设备变焦，可以是电子变焦或光学变
     * 焦；
     * 2、请求 URL；/GMModule/V3/Device/AdjustFocalLength
     *
     * @param requestVo
     * @return
     */
    JSONObject v3AdjustFocalLength(MonitorAdjustFocalLengthVo requestVo, int equipmentType);


    /**
     * 5.5.4.27 设置电池工作模式
     * 功能说明：
     * 1、设置电池摄像机的工作模式，前提是设备支持工作模式切换；
     * 2、请求 URL；/GMModule/V3/Device/SetBatteryWorkMode
     *
     * @param requestVo
     * @return
     */
    JSONObject v3SetBatteryWorkMode(MonitorSetBatteryWorkModeVo requestVo, int equipmentType);

    /**
     * 根据前端条件查询设备列表
     * @param searchRequest
     * @return
     */
    PageInfo<ZfbMonitorEquipment> getEquipmentListByCondition(ZfbMonitorEquipmentCondition searchRequest);

    List<ZfbMonitorEquipment> getLicenseList(Integer id);

    /**
     * 当前订单关联的监控列表
     * @param orderNo
     * @return
     */
    ZfbOrderMonitorLinkDataResponse getOrderMonitorLink(String orderNo);

    ZfbMonitorControlLightResponse controlLight(MonitorControlLightRequest requestVo, String orderNo);

    ZfbMonitorLightUserInfoResponse lightUserInfo(MonitorControlLightUserinfoRequest requestVo, String orderNo);

    String getLicenseById(Integer id);

    ZfbMonitorLightResultResponse lightResult(MonitorControlLightRequest requestVo, String orderNo);

    ZfbMonitorEquipmentAvailableResponse getAvailableList(String[] license, Integer num);

    List<ZfbMonitorEquipmentStatusResponse> getStatus(String[] license);
}
